home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / ABUSESRC.ZIP / AbuseSrc / macabuse / imlib / gifread.c < prev    next >
C/C++ Source or Header  |  1997-05-20  |  3KB  |  120 lines

  1. #include "gifread.hpp"
  2. #include "palette.hpp"
  3. #include "image.hpp"
  4. #include "video.hpp"
  5. #include "linked.hpp"
  6. #include "gifdecod.hpp"
  7. #include "system.h"
  8. #include "dos.h"
  9. #include <math.h>
  10. #include <string.h>
  11. #include <stdio.h>
  12. #include "dir.h"
  13. #include "macs.hpp"
  14.  
  15.  
  16. struct {
  17.     unsigned short int    Width;
  18.     unsigned short int    Height;
  19.     unsigned char    ColorMap[3][256];
  20.     unsigned short int    BitPixel;
  21.     unsigned short int    ColorResolution;
  22.     unsigned short int    Background;
  23.     unsigned short int    AspectRatio;
  24. } GifScreen;
  25.  
  26. struct {
  27.   unsigned short int w,h;
  28.   unsigned char color_info,background,reserved;
  29. } gif_screen;
  30.  
  31. struct {
  32.   unsigned short int xoff,yoff,w,h;
  33.   unsigned char color_info;
  34. } gif_image;
  35.  
  36. image *read_gif(char *fn, palette *&pal)
  37. {
  38.   char buf[100],er;
  39.   unsigned char sep;
  40.   int ncolors;
  41.   FILE *fp;
  42.   image *im;
  43.   clear_errors();
  44.   fp=fopen(fn,"rb");
  45.   er=0;
  46.   im=NULL;
  47.   if (fp==NULL) er=imFILE_NOT_FOUND;
  48.   else
  49.   {
  50.     if (fread(buf,1,6,fp)==6)
  51.     {
  52.       buf[6]=0;
  53.       if (!strcmp("GIF87a",buf))
  54.       {
  55.         fread((char *)&gif_screen.w,2,1,fp);
  56.         gif_screen.w=int_to_local(gif_screen.w);
  57.         fread((char *)&gif_screen.h,2,1,fp);
  58.         gif_screen.h=int_to_local(gif_screen.h);
  59.         fread((char *)&gif_screen.color_info,1,1,fp);
  60.         fread((char *)&gif_screen.background,1,1,fp);
  61.         if (fread((char *)&gif_screen.reserved,1,1,fp)==1)
  62.     {
  63.       if (gif_screen.color_info&128)
  64.       {
  65.         ncolors=2<<(gif_screen.color_info&0x0f);
  66.         make_block(sizeof(palette));
  67. //        pal=new palette(ncolors);
  68.         pal=new palette(256);
  69.         if (pal)
  70.         {  
  71.               if (fread((char *)pal->addr(),1,ncolors*3,fp)!=ncolors*3) er=imREAD_ERROR;
  72.         } else er=imMEMORY_ERROR;
  73.       }
  74.       if (!er)
  75.       { do
  76.         {
  77.           if (fread((char *)&sep,1,1,fp)!=1)
  78.         er=imREAD_ERROR;
  79.         } while (!er && sep!=',');
  80.             fread((char *)&gif_image.xoff,2,1,fp);
  81.             gif_image.xoff=int_to_local(gif_image.xoff);
  82.             fread((char *)&gif_image.yoff,2,1,fp);
  83.             gif_image.yoff=int_to_local(gif_image.yoff);
  84.             fread((char *)&gif_image.w,2,1,fp);
  85.             gif_image.w=int_to_local(gif_image.w);
  86.             fread((char *)&gif_image.h,2,1,fp);
  87.             gif_image.h=int_to_local(gif_image.h);
  88.         if (!er && (fread((char *)&gif_image.color_info,1,1,fp)==1))
  89.         {
  90.           if (gif_image.color_info&128)
  91.           {
  92.         ncolors=2<<(gif_image.color_info&0x0f);
  93.                 CHECK(ncolors<=256);
  94.         make_block(sizeof(palette));
  95.         pal = new palette(ncolors);
  96.         if (pal)
  97.         { if (fread((char *)pal->addr(),1,ncolors*3,fp)!=ncolors*3) er=imREAD_ERROR;
  98.         } else er=imMEMORY_ERROR;
  99.           }
  100.  
  101.           if (!er)
  102.           {
  103.         make_block(sizeof(image));
  104.         im=new image(gif_image.w+1,gif_image.h);
  105.         decode_gif_data(im,fp);
  106.         fclose(fp);
  107.           }
  108.  
  109.         } else er=imREAD_ERROR;
  110.       }
  111.  
  112.     } else er=imREAD_ERROR;
  113.       } else er=imINCORRECT_FILETYPE;
  114.     } else er=imREAD_ERROR;
  115.     fclose(fp);
  116.   }
  117.   set_error(er);
  118.   return im;
  119. }
  120.